
#include "./micropython/py/dynruntime.h"

mp_obj_t _ListAPI_CreateList;
mp_obj_t _ListAPI_GetItem;
mp_obj_t _ListAPI_SetItem;
mp_obj_t _ListAPI_GetLength;
mp_obj_t _ListAPI_Append;
mp_obj_t _ListAPI_Insert;
mp_obj_t _ListAPI_Remove;
mp_obj_t _ListAPI_Pop;
mp_obj_t _ListAPI_Extend;
mp_obj_t _ListAPI_Clear;

static mp_obj_t init_ListAPI_CreateList(mp_obj_t func) {
    _ListAPI_CreateList = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_GetItem(mp_obj_t func) {
    _ListAPI_GetItem = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_SetItem(mp_obj_t func) {
    _ListAPI_SetItem = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_GetLength(mp_obj_t func) {
    _ListAPI_GetLength = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Append(mp_obj_t func) {
    _ListAPI_Append = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Insert(mp_obj_t func) {
    _ListAPI_Insert = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Remove(mp_obj_t func) {
    _ListAPI_Remove = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Pop(mp_obj_t func) {
    _ListAPI_Pop = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Extend(mp_obj_t func) {
    _ListAPI_Extend = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_ListAPI_Clear(mp_obj_t func) {
    _ListAPI_Clear = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

//mp_obj_t ListAPI_CreateList(size_t n_args, const mp_obj_t *args) {
//    return mp_call_function_n_kw(_ListAPI_CreateList, n_args, 0, args);
//}

#define list(...) ListAPI_CreateList((mp_obj_t[]){__VA_ARGS__, MP_OBJ_NULL})

mp_obj_t ListAPI_CreateList(const mp_obj_t *args) {
    size_t n_args = 0;
    while (args[n_args] != MP_OBJ_NULL) {
        n_args++;
    }
    return mp_call_function_n_kw(_ListAPI_CreateList, n_args, 0, args);
}

mp_obj_t ListAPI_GetItem(mp_obj_t list, mp_obj_t index) {
    mp_obj_t args[2] = {list, index};
    return mp_call_function_n_kw(_ListAPI_GetItem, 2, 0, args);
}

mp_obj_t ListAPI_SetItem(mp_obj_t list, mp_obj_t index, mp_obj_t value) {
    mp_obj_t args[3] = {list, index, value};
    return mp_call_function_n_kw(_ListAPI_SetItem, 3, 0, args);
}

mp_obj_t ListAPI_GetLength(mp_obj_t list) {
    mp_obj_t args[1] = {list};
    return mp_call_function_n_kw(_ListAPI_GetLength, 1, 0, args);
}

mp_obj_t ListAPI_Append(mp_obj_t list, mp_obj_t value) {
    mp_obj_t args[2] = {list, value};
    return mp_call_function_n_kw(_ListAPI_Append, 2, 0, args);
}

mp_obj_t ListAPI_Insert(mp_obj_t list, mp_obj_t index, mp_obj_t value) {
    mp_obj_t args[3] = {list, index, value};
    return mp_call_function_n_kw(_ListAPI_Insert, 3, 0, args);
}

mp_obj_t ListAPI_Remove(mp_obj_t list, mp_obj_t value) {
    mp_obj_t args[2] = {list, value};
    return mp_call_function_n_kw(_ListAPI_Remove, 2, 0, args);
}

mp_obj_t ListAPI_Pop(mp_obj_t list, mp_obj_t index) {
    mp_obj_t args[2] = {list, index};
    return mp_call_function_n_kw(_ListAPI_Pop, 2, 0, args);
}

mp_obj_t ListAPI_Extend(mp_obj_t list, mp_obj_t iterable) {
    mp_obj_t args[2] = {list, iterable};
    return mp_call_function_n_kw(_ListAPI_Extend, 2, 0, args);
}

mp_obj_t ListAPI_Clear(mp_obj_t list) {
    mp_obj_t args[1] = {list};
    return mp_call_function_n_kw(_ListAPI_Clear, 1, 0, args);
}

#define CSDK_INIT_LISTAPI_GLOBALS static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_CL, init_ListAPI_CreateList); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_GI, init_ListAPI_GetItem); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_SI, init_ListAPI_SetItem); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_GLe, init_ListAPI_GetLength); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_Ap, init_ListAPI_Append); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_In, init_ListAPI_Insert); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_Rm, init_ListAPI_Remove); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_Po, init_ListAPI_Pop); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_Ex, init_ListAPI_Extend); static MP_DEFINE_CONST_FUN_OBJ_1(O_LA_Cr, init_ListAPI_Clear);
#define CSDK_EXPORT_LISTAPI_GLOBALS mp_store_global(MP_QSTR_regLA_CL, MP_OBJ_FROM_PTR(&O_LA_CL)); mp_store_global(MP_QSTR_regLA_GI, MP_OBJ_FROM_PTR(&O_LA_GI)); mp_store_global(MP_QSTR_regLA_SI, MP_OBJ_FROM_PTR(&O_LA_SI)); mp_store_global(MP_QSTR_regLA_GLe, MP_OBJ_FROM_PTR(&O_LA_GLe)); mp_store_global(MP_QSTR_regLA_Ap, MP_OBJ_FROM_PTR(&O_LA_Ap)); mp_store_global(MP_QSTR_regLA_In, MP_OBJ_FROM_PTR(&O_LA_In)); mp_store_global(MP_QSTR_regLA_Rm, MP_OBJ_FROM_PTR(&O_LA_Rm)); mp_store_global(MP_QSTR_regLA_Po, MP_OBJ_FROM_PTR(&O_LA_Po)); mp_store_global(MP_QSTR_regLA_Ex, MP_OBJ_FROM_PTR(&O_LA_Ex)); mp_store_global(MP_QSTR_regLA_Cr, MP_OBJ_FROM_PTR(&O_LA_Cr));